//
// Created by Abstergo on 24-6-22.
//

#ifndef RESULT_HPP
#define RESULT_HPP
#include <base/defs.h>

namespace tbs {
template<typename S, typename E> class Result {
private:
  S _s;
  E _e;
  bool _success{};

  Result() = default;

public:
  inline static Result<S, E> make_success(S &&val);

  inline static Result<S, E> make_error(E &&val);

  /**
   * 是否成功
   * @return
   */
  [[nodiscard]] bool is_success() CONST;

  /**
   * 成功结果，若失败时调用，抛出异常为失败结果
   * @return
   */
  S value() CONST;

  /**
   * 失败结果，仅可在失败时调用否则抛出异常
   * @return
   */
  E error() CONST;
};

/**
 * 生成结果
 * @tparam EP 结果表达式
 * @tparam S 成功结果
 * @tparam E 失败结果
 * @param exp 表达式
 * @param v 成功结果
 * @param e 失败结果
 * @return
 */
template<typename EP, typename S, typename E> Result<S, E> make_result(EP exp, S &&v, E &&e);

#include "inls/base/Result.cuh"
}

#endif //RESULT_HPP
